﻿using System; 
using System.ComponentModel;
using System.Drawing;
using System.Collections.Generic;
using System.Windows.Forms;
using System.IO;
using ADV_Evaluator;
using ADV_Evaluator.Data;
using ADV_Evaluator.Command;


namespace ADV_Editor.CommandDialog {

    /// <summary>
    /// どのSEを再生するかを選択するダイアログ
    /// </summary>
    partial class SeDialog : CommandDialogBase {

        /// <summary>
        /// 初期値を指定しないコンストラクタ
        /// </summary>
        public SeDialog() {
            // コンポーネントの初期化
            InitializeComponent();
            // サウンド/SE フォルダ下にあるサウンドファイルをすべてListBoxに表示する
            foreach (string str in Directory.GetFiles("サウンド/SE")) {
                string filename = Path.GetFileName(str);
                string ext = Path.GetExtension(str).ToLower();
                foreach (string _ext in Const.SoundExtensions) {
                    if (ext == _ext) {
                        listBox.Items.Add(filename);
                        break;
                    }
                }
            }
            // メディアプレイヤー設定
            axWindowsMediaPlayer.settings.autoStart = false;
            // リストボックス設定
            listBox.SelectedIndex = 0;
        }

        /// <summary>
        /// 最初にBGMをひとつ選択しておくコンストラクタ
        /// </summary>
        /// <param name="param">属性</param>
        public SeDialog(SeParams param) : this() {
            if (param.FileName.Length == 0) {
                listBox.SelectedIndex = 0;
            } else {
                listBox.SelectedItem = param.FileName;
            }
        }

        /// <summary>
        /// 右クリックメニューから「再生」を選択されたとき
        /// </summary>
        private void toolStripMenuItem_Play_Click(object sender, EventArgs e) {
            // 演奏するファイル名
            string filename = listBox.SelectedItem as string;
            // 未選択やNoneは除外
            if (filename == null || filename == "(None)") {
                return;
                // 演奏開始
            } else {
                axWindowsMediaPlayer.URL = "サウンド/SE/" + filename;
                axWindowsMediaPlayer.Ctlcontrols.play();
            }
        }

        /// <summary>
        /// 右クリックメニューが開こうとしているとき
        /// </summary>
        private void contextMenuStrip_Opening(object sender, CancelEventArgs e) {
            // リストボックスが選択されていないか、(None)なら中止する
            if (listBox.SelectedIndex <= 0) {
                e.Cancel = true;
            }
        }

        /// <summary>
        /// リストボックスでダブルクリックされたとき
        /// </summary>
        private void listBox_MouseDoubleClick(object sender, MouseEventArgs e) {
            // 右クリックメニューの処理を流用
            toolStripMenuItem_Play_Click(sender, e);
        }

        /// <summary>
        /// リストボックス上でマウスボタンが押されたとき
        /// </summary>
        private void listBox_MouseDown(object sender, MouseEventArgs e) {
            // 右クリックでの選択に対応させる
            switch (e.Button) {
            case MouseButtons.Right:
                listBox.SelectedIndex = listBox.IndexFromPoint(e.Location);
                // 取得できなかったときは最後の項目を選択したことにする
                if (listBox.SelectedIndex >= 0) {
                    listBox.Focus();
                }
                break;
            }
        }

        /// <summary>
        /// フォームを閉じた後
        /// </summary>
        private void CommandDialog_Bgm_FormClosed(object sender, FormClosedEventArgs e) {
            // BGMを止める
            axWindowsMediaPlayer.Ctlcontrols.stop();
            axWindowsMediaPlayer.Dispose();
        }

        /// <summary>
        /// 設定されたSEをコマンド化したもの
        /// </summary>
        public override CommandListData Command {
            get {
                string filename = listBox.SelectedItem as string;
                if (filename == null || filename == "(None)") {
                    filename = "";
                }
                SeParams param = new SeParams();
                param.FileName = filename;
                if (filename.Length == 0) {
                    return new CommandListData(CommandName.ＳＥの停止, param);
                } else {
                    return new CommandListData(CommandName.ＳＥの演奏, param);
                }
            }
        }



        #region ヘルプ
        /// <summary>
        /// OKボタンのヘルプ
        /// </summary>
        private void button_OK_HelpRequested(object sender, HelpEventArgs hlpevent) {
            ShowPopupHelp(sender, "このダイアログを閉じて、コマンドを追加します。");
        }
        /// <summary>
        /// キャンセルボタンのヘルプ
        /// </summary>
        private void button_Cancel_HelpRequested(object sender, HelpEventArgs hlpevent) {
            ShowPopupHelp(sender, "変更内容を保存せずにこのダイアログを閉じます。");
        }
        /// <summary>
        /// SE一覧のヘルプ
        /// </summary>
        private void listBox_HelpRequested(object sender, HelpEventArgs hlpevent) {
            ShowPopupHelp(sender, "インポートされているSEの一覧です。\nSEをゲームで使用する際は、あらかじめインポートしておく必要があります。\nダブルクリック、若しくは右クリックのメニューで再生できます。\n(None)を指定すると、演奏されているSEを停止します。");
        }
        #endregion

    }
}